from sys import path
import os

pwd = os.path.abspath("./")
pwd_up = os.path.abspath("../")

this_library_path = os.path.join(pwd,"autowork_for_office/")
path.extend([this_library_path])

from docx import Document
from docxes.utils import *

file_str1 = "主书"
file_str2 = "同步训练"
file_str3 = "答案"
doc1 = Document(
    pwd_up + "/" + file_str1 + ".docx"
)
paras1 = doc1.paragraphs
doc2 = Document(
    pwd_up + "/" + file_str2 + ".docx"
)
paras2 = doc2.paragraphs
doc3 = Document(
    pwd_up + "/" + file_str3 + ".docx"
)
paras3 = doc3.paragraphs

"""主要是答案和题目的页码不都是在同样的一页或者两页里。
之前想的是如果题目和答案在一个block（PXXX的字符块）里，那么很多事情就好办了，比如说不对应的地方出在哪里，等等。

blocks1=get_blocks_paras(paras1,RE_PSTART_STR,RE_PSTART_STR)
blocks2=get_blocks_paras(paras2,RE_PSTART_STR,RE_PSTART_STR)
blocks3=get_blocks_paras(paras3,RE_PSTART_STR,RE_PSTART_STR)
"""

# 确定题目结尾的正则表达式list。
new_question_end_re_str = [*RE_QUESTION_STRS, RE_PSTART_STR]

questions2 = get_blocks_paras(paras2, RE_QUESTION_STRS, new_question_end_re_str)

RE_ANSWER_STRS = ["^(\d+)[\.．]\W*?\w+", "^(\d+)[\.．]\W+", "^解[\:：]"]

new_answer_end_re_str = [*RE_ANSWER_STRS, RE_PSTART_STR]
# answers3=get_blocks_paras(paras3,RE_ANSWER_STRS,new_answer_end_re_str)

###################################
# 因为docx文档中可以有很多第三方的内容，同时跨文档的复制粘贴又没有很好的python解决方案。
# 所以要将一个文档里的复杂内容转移到另一个文档里，暂时还缺少没有手工参与的解决方案。
# 我的解决办法是：先把多个文档的各大段的内容手工复制到一个新的word文件里,注意⚠️大段的复制之间不要留有空段！！！然后再对这个新word文件进行文件内的处理。
####################################

# 将主书和答案复制到新的“主书答案.docx”文件中
file_str13 = file_str1 + file_str3
doc13 = Document(
    pwd_up + "/" + file_str13 + ".docx"
)
paras13 = doc13.paragraphs

# 将同步训练和答案复制到新的“主书答案.docx”文件中
file_str23 = file_str2 + file_str3
doc23 = Document(
    pwd_up + "/" + file_str23 + ".docx"
)
paras23 = doc23.paragraphs

#######
# 对前面合并的文档进行内容分段提取
#######

paras1_len = len(paras1)
paras2_len = len(paras2)
paras3_len = len(paras3)

paras13_len = len(paras13)
paras23_len = len(paras23)
# TODO：可以与前面没有合并的文档进行比对性检查
if not (paras13_len == paras1_len + paras3_len):
    raise IOError("The combined file: %r have NO same paragraphs!" % file_str13)

if not (paras23_len == paras2_len + paras3_len):
    raise IOError("The combined file: %r have NO same paragraphs!" % file_str23)

# 获得分段的内容
questions13_1 = get_blocks_paras(
    paras13, RE_QUESTION_STRS, new_question_end_re_str, stop=paras1_len
)
answers13_3 = get_blocks_paras(
    paras13, RE_ANSWER_STRS, new_answer_end_re_str, start=paras1_len
)

len13_1 = len(questions13_1)

for i in range(len13_1):
    question_tail_p = paras13[questions13_1[i]["paras"][-1]]
    insert_paras_nums = answers13_3[i]["paras"]

    copy_para_list = []
    for j in insert_paras_nums:
        copy_para_list.append(paras13[j])

    move_elements(copy_para_list, question_tail_p)

doc13.save(file_str1 + "插入答案.docx")

########
# 分级训练答案的处理基本类似主书答案的处理，只不过由于答案是两者都有所以还需要稍微的额外处理一下。
########

questions23_2 = get_blocks_paras(
    paras23, RE_QUESTION_STRS, new_question_end_re_str, stop=paras2_len
)
answers23_3 = get_blocks_paras(
    paras23, RE_ANSWER_STRS, new_answer_end_re_str, start=paras2_len
)

len23_2 = len(questions23_2)

for i in range(len23_2):
    question_tail_p = paras23[questions23_2[i]["paras"][-1]]
    # 注意⚠️：这个地方需要将之前主书的答案去掉！
    insert_paras_nums = answers23_3[len13_1 + i]["paras"]

    copy_para_list = []
    for j in insert_paras_nums:
        copy_para_list.append(paras23[j])

    move_elements(copy_para_list, question_tail_p)

doc23.save(file_str2 + "插入答案.docx")
